<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport"
        content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0">
  <meta http-equiv="X-UA-Compatible" content="ie=edge">
  <title>缓动动画原理</title>
  <style>
    div {
      position: absolute;
      left: 0;
      width: 100px;
      height: 100px;
      background-color: pink;
    }

    span {
      position: absolute;
      left: 0;
      top: 200px;
      display: block;
      width: 150px;
      height: 150px;
      background-color: purple;
    }
  </style>
</head>
<body>
  <button>点击夏雨荷才走</button>
  <span>夏雨荷</span>
  <script>
    // 缓动动画函数封装obj目标对象 target 目标位置
    // 思路：
    // 1. 让盒子每次移动的距离慢慢变小， 速度就会慢慢落下来。
    // 2. 核心算法：(目标值 - 现在的位置) / 10 做为每次移动的距离 步长
    // 3. 停止的条件是： 让当前盒子位置等于目标位置就停止定时器
    function animate (obj, target) {
      // 先清除以前的定时器，只保留当前的一个定时器执行
      clearInterval(obj.timer)
      obj.timer = setInterval(function () {
        // 步长值写到定时器的里面
        var step = (target - obj.offsetLeft) / 10
        if (obj.offsetLeft === target) {
          // 停止动画 本质是停止定时器
          clearInterval(obj.timer)
        } else {
          // 把每次加1 这个步长值改为一个慢慢变小的值  步长公式：(目标值 - 现在的位置) / 10
          obj.style.left = obj.offsetLeft + step + 'px'
        }
      }, 15)
    }

    var span = document.querySelector('span')
    var btn = document.querySelector('button')

    btn.addEventListener('click', function () {
      // 调用函数
      animate(span, 500)
    })
    // 匀速动画 就是 盒子是当前的位置 +  固定的值 10
    // 缓动动画就是  盒子当前的位置 + 变化的值(目标值 - 现在的位置) / 10）
  </script>
</body>
</html>